《出一套iOS高级面试题》实战题 解答

Author Avatar
killua167 7月 24, 2018

J_Knight_大神的《出一套 iOS 高级面试题》实战题 解答

原文

AppDelegate如何瘦身?

有以下方法:

  1. 通过创建分类,将一些第三方初始化以及创建的代码抽离到AppDelegate的分类当中,实现AppDelegate的瘦身。
  2. 通过实现ModuleManager类,来管理需要在AppDelegate中启动的繁多的模块。首先在软件启动时通过读取配置文件(通常用plist)读取模块,在AppDelegate的每个事件接收到响应的时,在对应方法中逐一调用已注册的模块对应的响应方法。具体可以参考 FRDModuleManager

反射是什么?可以举出几个应用场景么?(知道多少说多少)

系统Foundation框架为我们提供了一些方法反射的API,我们可以通过这些API执行将字符串转为SEL等操作。由于OC语言的动态性,这些操作都是发生在运行时的。

/ SEL和字符串转换
FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector);
FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);
// Class和字符串转换
FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);
FOUNDATION_EXPORT Class __nullable NSClassFromString(NSString *aClassName);
// Protocol和字符串转换
FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) NS_AVAILABLE(10_5, 2_0);
FOUNDATION_EXPORT Protocol * __nullable NSProtocolFromString(NSString *namestr) NS_AVAILABLE(10_5, 2_0);

通过这些方法,我们可以在运行时选择创建那个实例,并动态选择调用哪个方法。

应用场景:
假设从服务器获取JSON串,通过这个JSON串获取需要创建的类为ViewController,并且调用这个类的getDataList方法。

Class class = NSClassFromString(@"ViewController");
ViewController *vc = [[class alloc] init];
SEL selector = NSSelectorFromString(@"getDataList");
[vc performSelector:selector];

有哪些场景是NSOperation比GCD更容易实现的?(或是NSOperation优于GCD的几点,知道多少说多少)

NSOperation相对于GCD:

  1. NSOperationQueue可以设置各个NSOperation之间的依赖关系。
  2. NSOperationQueue支持KVO,可以监测operation是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld)
  3. GCD 只支持FIFO 的队列,而NSOperationQueue可以调整队列的执行顺序(通过调整权重)。NSOperationQueue可以方便的管理并发、NSOperation之间的优先级。

使用场景:
NSOperation:各个操作之间有依赖关系、操作需要取消暂停、并发管理、控制操作之间优先级,限制同时能执行的线程数量.让线程在某时刻停止/继续等。

GCD:一般的需求很简单的多线程操作,用GCD都可以了,简单高效。
参考

App 启动优化策略?最好结合启动流程来说(main()函数的执行前后都分别说一下,知道多少说多少)

  1. 利用DYLD_PRINT_STATISTICS分析main()函数之前的耗时
  • 重新梳理架构,减少动态库、ObjC类的数目,减少Category的数目
  • 定期扫描不再使用的动态库、类、函数,例如每两个迭代一次
  • 用dispatchonce()代替所有的attribute((constructor))函数、C++静态对象初始化、ObjC的+load
  • 在设计师可接受的范围内压缩图片的大小,会有意外收获
  1. 利用锚点分析applicationWillFinishLaunching的耗时
  • 将不需要马上在applicationWillFinishLaunching执行的代码延后执行
  • rootViewController的加载,适当将某一级的childViewController或subviews延后加载
  • 如果你的App可能会被后台拉起并冷启动,可考虑不加载rootViewController
  1. 不应放过的一些小细节
  • 异步操作并不影响指标,但有可能影响交互体验,例如大量网络请求导致数据拥堵
  • 有时候一些交互上的优化比技术手段效果更明显,视觉上的快决不是冰冷的数据可以解释的,好好和你们的设计师谈谈动画
    参考

App 无痕埋点的思路了解么?你认为理想的无痕埋点系统应该具备哪些特点?(知道多少说多少)

iOS无埋点的核心技术是利用苹果的runtime机制,把系统事件、点击事件的指针替换成我们自己的函数来监测用户的操作,我们在自己的函数中采集并发送需要的数据。



参考

你知道有哪些情况会导致app崩溃,分别可以用什么方法拦截并化解?(知道多少说多少)

  • unrecognized selector crash
  • KVO crash
  • NSNotification crash
  • NSTimer crash
  • Container crash(数组越界,插nil等)
  • NSString crash (字符串操作的crash)
  • UI not on Main Thread Crash

解决方法